#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    BaseRestEditor(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    entry_=T_PARLOR;
    baseUrl_=URL_PARLOR;

    listModel=new QStringListModel(this);
    ui->listView->setModel(listModel);

    tableModel=new TableModel(this);
    ui->tableView->setModel(tableModel);

    createMenu();
    updateMonth();
    move(200,100);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::generateMenu()
{
    menu->addAction(QStringLiteral("添加... (F1)"),this,&Widget::newItem);
    menu->addSeparator();
    menu->addAction(QStringLiteral("编辑... (F2)"),this,&Widget::editItem);
    menu->addSeparator();
    menu->addAction(QStringLiteral("更新列表 (F4)"),this,&Widget::updateListView);
    menu->addAction(QStringLiteral("更新视图 (F5)"),this,&Widget::updateTableView);
}

void Widget::customKeyEvent(QKeyEvent *event)
{
    switch (event->key())
    {
    case Qt::Key_F1:
        newItem();
        break;
    case Qt::Key_F2:
        editItem();
        break;
    case Qt::Key_F4:
        updateListView();
        break;
    case Qt::Key_F5:
        updateTableView();
        break;
    }
}

void Widget::updateListView()
{
    QString url=baseUrl_ + "by_month/" + CurrentMonth;
    emit get(url);
}

void Widget::updateTableView()
{
    if(selectDate.isEmpty())
        selectDate=Today;

    tableModel->clear();
    QString url=baseUrl_ + "by_date/" + selectDate;
    emit get(url);
}

void Widget::updateMonth()
{
    if(ui->month->count() != 0)
        ui->month->clear();

    QString url=baseUrl_ + "get_months";
    emit get(url);
}

void Widget::newItem()
{
    QString url=baseUrl_ + "get_categories";
    emit get(url);
}

void Widget::editItem()
{
    QModelIndex index=ui->tableView->currentIndex();
    if(!index.isValid())
        return;

    int id=sp_fetchId(index);
    QString category=sp_fetchString(index,
                                    parlorColumns.indexOf("category"));
    QString detail=sp_fetchString(index,
                                  parlorColumns.indexOf("detail"));

    P_AddItem addItem(this,QStringList());
    addItem.setItem(id,category,detail);
    connect(&addItem,&P_AddItem::updateItem,this,&Widget::onUpdateItem);
    if(addItem.exec() == QDialog::Accepted)
        delayUpdateView();
}

void Widget::delayUpdateView()
{
    QEventLoop loop;
    QTimer::singleShot(200,&loop,&QEventLoop::quit);
    loop.exec();
    updateTableView();
}

void Widget::onReceivedObject(const QJsonObject &object)
{
    if(!object.contains("entry") || object.value("entry").toString() != entry_)
        return;

    processParlor(object);
}

void Widget::onAddItem(const QJsonObject &obj)
{
    QString url=baseUrl_ + "insert";
    emit post(url,QJsonDocument(obj).toJson(QJsonDocument::Compact));
}

void Widget::onUpdateItem(const QJsonObject &obj)
{
    QString url=baseUrl_ + "update";
    emit post(url,QJsonDocument(obj).toJson(QJsonDocument::Compact));
}

void Widget::processParlor(const QJsonObject &object)
{
    if(object.contains("detail"))
    {
        QJsonArray array=object.value("detail").toArray();
        if(array.isEmpty())
            return;

        tableModel->setArray(array,
                             parlorColumns,
                             parlorColumnHeaders);

        ui->tableView->hideColumn(0);
        if(tableModel->rowCount() > 0)
            ui->tableView->resizeRowsToContents();
    }
    else if(object.contains("month_list"))
    {
        QJsonArray array=object.value("month_list").toArray();
        if(array.isEmpty())
            return;

        Piv piv(array);
        QStringList items=piv.getStringList();
        if(!items.isEmpty())
        {
            ui->month->addItems(items);
            ui->month->setCurrentIndex(-1);
        }
    }
    else if(object.contains("date_list"))
    {
        QJsonArray array=object.value("date_list").toArray();
        if(array.isEmpty())
            return;

        Piv piv(array);
        QStringList items=piv.getStringList();
        if(!items.isEmpty())
            listModel->setStringList(items);
    }
    else if(object.contains("categories"))
    {
        QJsonArray array=object.value("categories").toArray();
        Piv piv(array);
        QStringList items=piv.getStringList();

        P_AddItem addItem(this,items);
        connect(&addItem,&P_AddItem::addItem,
                this,&Widget::onAddItem);
        if(addItem.exec() == QDialog::Accepted)
            delayUpdateView();
    }
}

void Widget::on_listView_doubleClicked(const QModelIndex &index)
{
    if(index.isValid())
    {
        selectDate=index.data().toString();
        updateTableView();
    }
}

void Widget::on_month_currentTextChanged(const QString &month)
{
    if(listModel->rowCount() != 0)
        listModel->setStringList(QStringList());

    static bool firstBoot=true;
    if(firstBoot)
        firstBoot=false;
    else {
        QString url=baseUrl_ + "get_dates/" + month;
        emit get(url);
    }
}

void Widget::on_kw_returnPressed()
{
    QString kw=ui->kw->text().trimmed();
    if(kw.isEmpty())
        return;

    QString url=baseUrl_ + "search/" + kw;
    emit get(url);
}

void Widget::on_tableView_doubleClicked(const QModelIndex &index)
{
    if(index.isValid())
    {
        int pos=parlorColumns.indexOf("detail");
        QString detail=sp_fetchString(index,pos);
        if(detail.isEmpty())
            return;

        qApp->clipboard()->setText(detail);
    }
}
